package tcp;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JOptionPane;
import model.TCPModelSPS;
import org.apache.log4j.Logger;
import tcpVerbindung.ByteWeise;
import tcpVerbindung.utils;

public class TCPsps {
	private Logger logger = Logger.getLogger(getClass());
	private TCPModelSPS model;
	private Thread thEmpfangen;
	private Thread thSenden;
	private String ip = "192.168.1.1";

	private int port = 2000;
	private Socket socket;
	private boolean verbindungAufgebaut;

	/**
	 * 
	 * @param model
	 */
	public TCPsps(TCPModelSPS model) {
		this.model = model;

		socket = new Socket();

		thEmpfangen = new Thread(new Runnable() {
			public void run() {
				while (true) {
					tcpEmpfangen();
					try {
						Thread.sleep(5L);
					} catch (InterruptedException e) {
						logger.warn("TCPSPS", e);
					}
				}
			}
		});

		thSenden = new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 2;) {
					tcpSenden();
					try {
						Thread.sleep(200L);
					} catch (InterruptedException e) {
						logger.warn("TCPSPS", e);
					}
				}
			}
		});
		tcpAufbauen();
	}

	/**
	 * 
	 */
	private void tcpAufbauen() {
		try {
			socket = utils.verbindungAufbauen(ip, port);

			verbindungAufgebaut = true;
		} catch (UnknownHostException e) {
			logger.warn("TCPSPS", e);

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;
		} catch (IOException e) {
			logger.warn("TCPSPS", e);

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;
		}

		if (verbindungAufgebaut) {
			logger.info("Verbindung zur SPS aufgebaut");

			thEmpfangen.start();
			thSenden.start();
		}
	}

	/**
	 * 
	 */
	private void tcpSenden() {
		byte[] io = model.getIoByte();

		int[] intParameter = model.getIntParameter();

		float[] floatParameter = model.getFloatParameter();
		try {
			ByteWeise.sendenListe(socket, io, intParameter, floatParameter);
		} catch (IOException e) {
			logger.warn("TCPSPS", e);

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;

			thSenden.stop();
			thEmpfangen.stop();
		}
	}

	/**
	 * 
	 */
	private void tcpEmpfangen() {
		DataInputStream dataInputStream = null;
		try {
			dataInputStream = new DataInputStream(socket.getInputStream());
		} catch (IOException e) {
			logger.warn("TCPSPS", e);
		}

		try {
			model.setIOByte(ByteWeise.getEmpfangenBool(dataInputStream, 64));
		} catch (IOException e) {
			logger.warn("TCPSPS", e);

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;

			thSenden.stop();
			thEmpfangen.stop();
		}

		try {
			model.setIntParamter(ByteWeise.getEmpfangenInt(dataInputStream, 128));
		} catch (IOException e) {
			logger.warn("TCPSPS", e);

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;

			thSenden.stop();
			thEmpfangen.stop();
		}

		try {
			model.setFloatParamter(ByteWeise.getEmpfangenFloat(dataInputStream, 128));
		} catch (IOException e) {
			logger.warn("TCPSPS", e);

			String message = "Es konnte keine Verbindung zur SPS aufgebaut werden";

			JOptionPane.showMessageDialog(null, message, "Warnung", JOptionPane.WARNING_MESSAGE);

			verbindungAufgebaut = false;

			thSenden.stop();
			thEmpfangen.stop();
		}
	}
}